/* eslint-disable no-unused-vars */
//  移动位置、旋转 3dtiles
const { mars3d, Cesium } = window

export class TilesEditor extends mars3d.BaseClass {
    //= ========= 构造方法 ==========
    constructor(options) {
        super(options)

        this.options = options
        this.map = options.map
        this.scene = this.map.scene

        this._position = options.position
        this._heading = options.heading || 0
        this._range = options.range || 100

        this.dragging = false
        this.rotating = false
        this._enabled = false

        this.billboards = this.map.scene.primitives.add(new Cesium.BillboardCollection())
        this.handler = new Cesium.ScreenSpaceEventHandler(this.map.canvas)

        // 用来平移位置的指示器
        this.movep = this.billboards.add({
            position: this.position,
            // color: Cesium.Color.fromCssColorString("#FF0000"),
            image: options.moveImg,
            show: false,
            disableDepthTestDistance: Number.POSITIVE_INFINITY,
        })
        // 用来旋转的指示器
        this.rotatep = this.billboards.add({
            position: this.rotationPosition,
            // color: Cesium.Color.fromCssColorString("#FFFF00"),
            image: options.rotateImg,
            show: false,
            disableDepthTestDistance: Number.POSITIVE_INFINITY,
        })
        console.log(this)
    }

    //= ========= 对外属性 ==========
    // 启用状态
    get enabled() {
        return this._enabled
    }

    set enabled(val) {
        this._enabled = val
        if (val) {
            this.handler.setInputAction(p => {
                this.handlerOnLeafDown(p)
            }, Cesium.ScreenSpaceEventType.LEFT_DOWN)
            this.handler.setInputAction(p => {
                this.handlerOnMouseMove(p)
            }, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
            this.handler.setInputAction(p => {
                this.handlerOnLeftUp(p)
            }, Cesium.ScreenSpaceEventType.LEFT_UP)

            this.rotatep.show = true
            this.movep.show = true
        } else {
            this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)
            this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
            this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)

            this.rotatep.show = false
            this.movep.show = false
        }
    }

    // 移动位置的图标位置
    get position() {
        return this._position
    }

    set position(value) {
        this._position = value
        this.movep.position = this.position
        this.rotatep.position = this.rotationPosition
    }

    // 旋转方向的图标位置(依据位置和朝向计算)
    get rotationPosition() {
        if (this._position) {
            return mars3d.PointUtil.getPositionByDirectionAndLen(this._position, this._heading, this._range)
        } else {
            return null
        }
    }

    get heading() {
        return this._heading
    }

    set heading(value) {
        this._heading = value

        if (this._position) {
            this.rotatep.position = this.rotationPosition
        }
    }

    get range() {
        return this._range
    }

    set range(value) {
        this._range = value

        if (this._position) {
            this.rotatep.position = this.rotationPosition
        }
    }

    //= ========= 方法 ==========
    handlerOnLeafDown(event) {
        const pickedObjects = this.scene.drillPick(event.position, 2)

        for (let i = 0; i < pickedObjects.length; i++) {
            const pickedObject = pickedObjects[i]

            if (Cesium.defined(pickedObject) && pickedObject.primitive === this.movep) {
                this.dragging = true
                this.scene.screenSpaceCameraController.enableRotate = false
                break
            } else if (Cesium.defined(pickedObject) && pickedObject.primitive === this.rotatep) {
                this.rotating = true
                this.scene.screenSpaceCameraController.enableRotate = false
                break
            }
        }
    }

    handlerOnMouseMove(event) {
        const position = this.pickTerrain(event.endPosition)
        if (!position) {
            return
        }

        if (this.dragging) {
            this.position = position
            this.movep.position = this.position
            this.rotatep.position = this.rotationPosition
            this.fire(mars3d.EventType.change, {
                position: this._position,
            })
        } else if (this.rotating) {
            this.rotatep.position = position
            this._range = Cesium.Cartesian3.distance(this._position, position)
            this._heading = mars3d.MeasureUtil.getAngle(this._position, position) // 模型是正东为0

            this.fire(mars3d.EventType.change, {
                heading: this._heading,
            })
        }
    }

    handlerOnLeftUp(event) {
        if (this.dragging || this.rotating) {
            this.rotating = this.dragging = false
            this.scene.screenSpaceCameraController.enableRotate = true
            // 如果没有这句话 会导致billboards的某些没有刷新，无法再次点击
            this.billboards._createVertexArray = true
        }
    }

    pickTerrain(wndpos) {
        const ray = this.map.camera.getPickRay(wndpos)
        const pos = this.map.scene.globe.pick(ray, this.map.scene)
        return pos
    }

    remove() {
        // 从场景中移除
        if (this.billboards) {
            this.scene.primitives.remove(this.billboards)
            this.billboards = undefined
        }
        this.rotatep.show = false
        this.movep.show = false
    }

    destroy() {
        this.remove()
        this.handler.destroy()

        // 删除所有绑定的数据
        for (const i in this) {
            delete this[i]
        }
    }
}
